
import java.util.*;
/**
 * 
 * 包含min函数的栈
 * 
 * 描述

定义栈的数据结构，请在该类型中实现一个能够得到栈中所含最小元素的 min 函数，输入操作时保证 pop、top 和 min 函数操作时，栈中一定有元素。

此栈包含的方法有：
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素

数据范围：操作数量满足 
0
≤
n
≤
300
 
0≤n≤300  ，输入的元素满足 
∣
v
a
l
∣
≤
10000
 
∣val∣≤10000 
进阶：栈的各个操作的时间复杂度是 
O
(
1
)
 
O(1)  ，空间复杂度是 
O
(
n
)
 
O(n) 

示例:
输入:    ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]
输出:    -1,2,1,-1
解析:
"PSH-1"表示将-1压入栈中，栈中元素为-1
"PSH2"表示将2压入栈中，栈中元素为2，-1
“MIN”表示获取此时栈中最小元素==>返回-1
"TOP"表示获取栈顶元素==>返回2
"POP"表示弹出栈顶元素，弹出2，栈中元素为-1
"PSH1"表示将1压入栈中，栈中元素为1，-1
"TOP"表示获取栈顶元素==>返回1
“MIN”表示获取此时栈中最小元素==>返回-1
 */
public class 包含min函数的栈 {
    
    public static void main(String[] args) {
        
    }

    static Stack<Integer> stack = new Stack<>();
    static private int min = 0;

    public void push(int node) {
        if(stack.isEmpty()){
            min = node; //栈为空时，将min值赋值为node
        }
        stack.push(node-min); //将node-min的差值即diff放入栈中
        if(min>node){
            min = node; //保证min值为node元素最小值
        }
    }
    
    public void pop() {
        if(!stack.isEmpty()){
            int val = stack.pop();
            if(val<0){
                min = min-val; //若差值小于0，则说明出栈元素是当前最小值min，则需将min跟新为前一个最小值
            } 
        }
    }
    
    public int top() {
        

        int val = stack.peek();
        if(val<0){  //若diff小于0，则value为min值，否则，value值为min+val
            return min;
        }else{
            return min+val;
        }
    }
    
    public int min() {
        return min;
    }
}
